#include <mips/regdef.h>

# constante
#define OVERFLOW 1


# mcm:
# Calcula el mínimo común múltiplo usando el algoritmo
# de Euclides.
	.text
	.align 2
	.global mcm
	.extern mcd
mcm:
	.ent	mcm
	#
	# Creación del stack frame
	#
	.frame 	$fp, 32, ra
	subu	sp, sp, 32
	#los registros se guardan en orden, primero gp (28), dps fp (30) y dps ra (31)
	.cprestore 16
	sw		$fp, 20(sp)
	sw		ra, 24(sp)
	move 	$fp, sp

	#guardamos los dos argumentos recibidos en el argument building area del caller
	sw a0, 32($fp)
	sw a1, 36($fp)

	#
	# Cálculo del Mínimo Común Múltiplo
	#
	jal		mcd
	divu	t0, a1, v0
	multu   a0, t0
	#verificamos si hubo overflow (hi debe ser 0)
	mfhi	t1
	bgtu	t1, zero, overflow
	mflo	v0
	b		fin
overflow:
	li	  v0, OVERFLOW
fin:
	#
	# Liberación del stack frame
	#
	#restauramos los argumentos
	lw a0, 32($fp)
	lw a1, 36($fp)

	move 	sp, $fp
	lw		ra, 24(sp)
	lw		$fp, 20(sp)
	addu	sp, sp, 32
	jr ra
	.end	mcm
